﻿using System;
using System.Collections.Generic;
using System.Net;
using System.Data.Common;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;
using Kingdee.BOS;


namespace B2CProject
{
    public class IMPORTB2C
    {

        //新增B2C订单
        public string SAL_B2CSEODER(DataSet ds)
        {
            string result = "";
            string re_BillNo = "";
            try
            {
                 //// K/3 Cloud业务站点URL
                //// using Kingdee.BOS.WebApi.Client; // (需引用Kingdee.BOS.WebApi.Client.dll)  Cloud 业务站点Url
                //ApiClient client = new ApiClient("http://WIN-QPA2HIRFFI6/K3Cloud/");  //这个地址同网页打开的客户端地址
                //// 调用登录接口：d
                //// 参数说明：
                //// dbid     : 数据中心id。到管理中心数据库搜索：
                ////            select FDataCenterId, * from T_BAS_DataCenter
                //// userName : 用户名
                //// password ：原始密码（未加密）
                //// loid     : 语言id，中文为2052，中文繁体为3076，英文为1033
                //object[] loginInfo = new object[] {
                //    "57b9a94ba0e16f",//帐套Id
                // "赵元甲",//用户名
                // "Duocai2016",//密码
                // 2052};//语言id
                ////调用登陆接口 参数 数据中心Id，用户名，密码，语言id
                //bool ret = client.Login("57b9a94ba0e16f", "赵元甲", "Duocai2016", 2052);  1 5b9f77d7c99d12   2 5b7d0014505c1e
                InvokeHelper.DBID = "5b9f77d7c99d12";
                var login = InvokeHelper.Login();
                var iResult = JObject.Parse(login)["LoginResultType"].Value<int>();
                if (iResult != 1 && iResult != -5) // 登陆成功，开始保存数据  if (iResult == 1 || iResult == -5)
                {
                    //return "当前用户登录失败!";
                    throw new KDBusinessException("", "当前用户登录失败");
                }
                else
                {
                    string FNETORDERDATE = ds.Tables["B2C"].Rows[0]["FNETORDERDATE"].ToString();  //单据日期
                    string FNETORDERSOURCE = ds.Tables["B2C"].Rows[0]["FNETORDERSOURCE"].ToString();  //来源我网店
                    string FReceivePerson = ds.Tables["B2C"].Rows[0]["FReceivePerson"].ToString();  //收货人
                    string FMobilePhone = ds.Tables["B2C"].Rows[0]["FMobilePhone"].ToString();  //手机
                    string FFullAddress = ds.Tables["B2C"].Rows[0]["FFullAddress"].ToString();//FFullAddress 地址
                    string F_PAEZ_LYBILLNO = ds.Tables["B2C"].Rows[0]["F_PAEZ_LYBILLNO"].ToString();//FFullAddress 地址
                    string FAESID = ds.Tables["B2C"].Rows[0]["FAESID"].ToString();//FFullAddress 地址
                    

                    // 开始构建Web API参数对象
                    // 参数根对象：包含Creator、NeedUpDateFields、Model这三个子参数
                    // using Newtonsoft.Json.Linq;  // (需引用Newtonsoft.Json.dll)
                    JObject jsonRoot = new JObject();

                    // Creator: 创建用户
                    jsonRoot.Add("demo", "000000");

                    // NeedUpDateFields: 哪些字段需要更新？为空则表示参数中全部字段，均需要更新
                    jsonRoot.Add("NeedUpDateFields", new JArray(""));

                    // Model: 单据详细数据参数
                    JObject model = new JObject();
                    jsonRoot.Add("Model", model);


                    // 开始设置单据字段值
                    // 必须设置的字段：主键、单据类型、主业务组织，各必录且没有设置默认值的字段
                    // 特别注意：字段Key大小写是敏感的，建议从BOS设计器中，直接复制字段的标识属性过来

                    // 单据主键：必须填写，系统据此判断是新增还是修改单据；新增单据，填0
                    model.Add("FID", 0);
                    // 单据编号：可以忽略，由系统根据编码规则自动生成
                    model.Add("FBillNo", "");

                    // 单据类型:：必须填写，是基础资料字段  所有基础资料字段都按FNumber赋值，别用其他字段
                    JObject basedata = new JObject();
                    basedata.Add("FNumber", "B2CDD01_SYS");      //标准
                    model.Add("FBillTypeID", basedata);

                    //单据日期（FDate）                                                                     
                    model.Add("FNetOrderDate", FNETORDERDATE);  //DateTime.Today

                    //来源网店
                    basedata = new JObject();
                    basedata.Add("FNumber", FNETORDERSOURCE);      //标准
                    model.Add("FNetOrderSource", basedata);

                    //收获人
                    model.Add("FReceivePerson", FReceivePerson); 
                    //电话
                    model.Add("FMobilePhone", FMobilePhone);
                    //地址 FFullAddress
                    model.Add("FFullAddress", FFullAddress);

                    //FSOURCEORDERNUM 来源订单号
                    model.Add("FSOURCEORDERNUM", F_PAEZ_LYBILLNO);
                  
                    //结算币别 
                    basedata = new JObject();
                    basedata.Add("FNumber", "PRE001");      //标准
                    model.Add("FSettlementCurrency", basedata);
                    //支付方式
                    model.Add("FPayMode", "1");
                    //付款状态
                    model.Add("FPaymentStatus", "Y");
                    //是否开票
                    model.Add("FISInvoice", false );
                    //开票类型
                    model.Add("FInvoiceType", "1");
                    //汇率类型
                    basedata = new JObject();
                    basedata.Add("FNumber", "HLTX01_SYS");      //标准
                    model.Add("FExchangeTypeId", basedata);
                    //汇率
                    model.Add("FExchangeRate", 1.0);

                    //收获地址
                    basedata = new JObject();
                    basedata.Add("FFullAddress", FAESID);      //标准
                    model.Add("FReceiverAddress_Id", basedata);
                    
                    //本位币
                    basedata = new JObject();
                    basedata.Add("FNumber", "PRE001");      //标准
                    model.Add("FBaseCurrency", basedata);


                    //交易状态
                    model.Add("FNetOrderStatus", "TRADE_SELLER_SEND_GOODS");
                    //虚拟订单
                    model.Add("FIsFalse", false);
                    //手工修改地址
                    model.Add("FIsHandModifyAddress", true );
                    //是否执行自定义校验标识
                    model.Add("FIsValidateFlag", false);
                    //FDataUniqueFlagTime 生成订单操作唯一标识时间
                    model.Add("FDataUniqueFlagTime", FNETORDERDATE);
                    //发票要求信息
                    model.Add("FInvoiceRequirement", "NotReturn");
                    //-------------------------------------------------------------- 开始构建单据体参数：集合参数JArray
                    JArray entryRows = new JArray();
                    // 把单据体行集合，添加到model中，以单据体Key为标识   BOS里的分录标识明细信息
                    //ECC_AllThirdOrder__FOrderDetailEntry
                    string entityKeys = "ECC_AllThirdOrder__FOrderDetailEntry";   //
                    model.Add(entityKeys, entryRows);
                    // 通过循环创建单据体行：示例代码仅创建一行


                    foreach (DataRow myRow in ds.Tables["B2CEntry"].Rows)
                     {
                         string FMaterialId = myRow["FMaterialId"].ToString();
                         string FSaleUnit = myRow["FSaleUnit"].ToString();
                         string FQty = myRow["FQty"].ToString();
                         string FTaxPrice = myRow["FTaxPrice"].ToString();
                         string FStockOrgId = myRow["FStockOrgId"].ToString();
                         string FStockId = myRow["FStockId"].ToString();
                         string FTJNumber = myRow["FTJNumber"].ToString();
                         string F_SP_NUMBER = myRow["F_SP_NUMBER"].ToString();
                         string F_SP_NAME = myRow["F_SP_NAME"].ToString();


                         // 添加新行，把新行加入到单据体行集合
                         JObject entryRow = new JObject();
                         entryRows.Add(entryRow);


                         // 给新行，设置关键字段值
                         // 单据体主键：必须填写，系统据此判断是新增还是修改行
                         entryRow.Add("FEntryID", 0);

                         //商品SKU
                         entryRow.Add("F_PAEZ_SKUID", F_SP_NUMBER);
                         //商品SKU名称
                         entryRow.Add("FGoodSkuName", F_SP_NAME);



                         ////套件
                         //if (FTJNumber != "")
                         //{
                         //    basedata = new JObject();
                         //    basedata.Add("FNumber", FTJNumber);
                         //    entryRow.Add("FSuiteId", basedata);


                         //    // 单位(FUnitId)：基础资料，填写编码                      这个需要传
                         //    basedata = new JObject();
                         //    basedata.Add("FNumber", FSaleUnit); //"盒"
                         //    entryRow.Add("FSuiteUnitID", basedata);
                         //    // 数量(FQty)：数量字段
                         //    entryRow.Add("FSuiteQty", FQty);
                         //    ////含税单价
                         //    //entryRow.Add("FSuitePrice", FTaxPrice);
                         //    // //含税单价
                         //    //entryRow.Add("FSuiteAmount", decimal.Parse(FTaxPrice) * decimal.Parse(FQty));
                         //}

                         //else
                         //{

                             //物料(FMaterialId)：基础资料，填写编码                   这个需要传
                             basedata = new JObject();
                             basedata.Add("FNumber", FMaterialId);
                             entryRow.Add("FMaterialId", basedata);

                             // 单位(FUnitId)：基础资料，填写编码                      这个需要传
                             basedata = new JObject();
                             basedata.Add("FNumber", FSaleUnit); //"盒"
                             entryRow.Add("FSaleUnit", basedata);
                             // 数量(FQty)：数量字段
                             entryRow.Add("FQty", FQty);
                             //含税单价
                             entryRow.Add("FTaxPrice", FTaxPrice);
                        // }
                        //税率
                         entryRow.Add("FTaxRate", 0.00);
                        //库存组织
                         basedata = new JObject();
                         basedata.Add("FNumber", FStockOrgId);
                         entryRow.Add("FStockOrgId", basedata);
                        //仓库
                         basedata = new JObject();
                         basedata.Add("FNumber", FStockId);
                         entryRow.Add("FStockId", basedata);
                        //交易状态
                         entryRow.Add("FRecordStatus", "TRADE_SELLER_SEND_GOODS");
                        //强制第三方发货
                         entryRow.Add("FISCNSHIP", false);

                     }

                    string send = JsonConvert.SerializeObject(jsonRoot);

                    result = InvokeHelper.Save("ECC_AllThirdOrder", send);
                }
                JObject jo = (JObject)JsonConvert.DeserializeObject(result);
                string respones = jo["Result"]["ResponseStatus"]["IsSuccess"].ToString();
                if (respones.ToUpper() == "TRUE")
                {
                     re_BillNo = jo["Result"]["Number"].ToString();
                   // return CreateReturn("1", "TRUE", re_BillNo);
                    return re_BillNo;
                }
                else

                {
                    
                    throw new KDBusinessException("", jo.ToString());
                }
            }
            catch (Exception exp)
            {
                StringBuilder sb = new StringBuilder();
                sb.AppendLine("程序运行遇到了未知的错误：");
                sb.Append("错误提示：").AppendLine(exp.Message);
                sb.Append("错误堆栈：").AppendLine(exp.StackTrace);
                throw new KDBusinessException("", sb.ToString());
                  
            }
        }

    }
}
